package com.fucius.study.leetcode;

/**
 *8. 旋转字符串
 * 中文English
 * 给定一个字符串（以字符数组的形式给出）和一个偏移量，根据偏移量原地旋转字符串(从左向右旋转)。
 *
 * 样例
 * 样例 1:
 *
 * 输入:  str="abcdefg", offset = 3
 * 输出:  str = "efgabcd"
 * 样例解释:  注意是原地旋转，即str旋转后为"efgabcd"
 * 样例 2:
 *
 * 输入: str="abcdefg", offset = 0
 * 输出: str = "abcdefg"
 * 样例解释: 注意是原地旋转，即str旋转后为"abcdefg"
 * 样例 3:
 *
 * 输入: str="abcdefg", offset = 1
 * 输出: str = "gabcdef"
 * 样例解释: 注意是原地旋转，即str旋转后为"gabcdef"
 * 样例 4:
 *
 * 输入: str="abcdefg", offset =2
 * 输出: str = "fgabcde"
 * 样例解释: 注意是原地旋转，即str旋转后为"fgabcde"
 * 样例 5:
 *
 * 输入: str="abcdefg", offset = 10
 * 输出: str = "efgabcd"
 * 样例解释: 注意是原地旋转，即str旋转后为"efgabcd"
 * 挑战
 * 在数组上原地旋转，使用O(1)的额外空间
 *
 * 说明
 * 原地旋转意味着你要在s本身进行修改。你不需要返回任何东西。
 *
 * 注意事项
 * offset >= 0
 * str的长度 >= 0
 */
public class RotateString {
    /**
     * @param str: An array of char
     * @param offset: An integer
     * @return: nothing
     */
    public static void rotateString(char[] str, int offset) {
        if (str==null||str.length==0) {
            return;
        }
        int length = str.length;
        offset = offset%length;
        if (offset<=0) {
            return;
        }
        // 输入: str="abcdefg", length = 7 offset =2
        // 输出: str = "fgabcde"
        for(int i = length-offset;i<length;i++){
            char temp = str[i];
            int j = i;
            while(i-j<length-offset){
                str[j--] = str[j];
            }
            str[j] = temp;
        }
    }

    public static void main(String[] args) {
        char[] str = {};
        int offset = 20;
        rotateString(str,offset);
        for (char c : str) {
            System.out.printf(c+",");
        }
    }
}
